// UdpServer.cc文件
#include "UdpServer.hpp"
#include "Route.hpp"
#include "ThreadPool.hpp"
#include <memory>

using namespace MyThreadPool;
using task_t = std::function<void()>;



// 格式为：udpserver port
int main(int argc, char *argv[])
{
    if (argc != 2)
    {
        std::cout << "Usage:" << argv[0] << " port" << std::endl;
        return 1;
    }
    uint16_t port = std::stoi(argv[1]);
    Refresh_Log_To_Console();
    // 1.路由对象提供路由功能
    Route r;
    // 2.线程池
    auto tp = ThreadPool<task_t>::GetInstance(); // 获取单例
    // 3.网络服务器对象提供通信功能
    std::unique_ptr<UdpServer> server = std::make_unique<UdpServer>(port, [&r, &tp](int sockfd, const std::string &message, InetAddr &peer){
        task_t t = std::bind(&Route::MessageRoute, &r, sockfd, message, peer); // 布置任务
        tp->Equeue(t); // 入队列
        });
    server->Init();
    server->Start();
    return 0;
}

// // 格式为：udpserver port
// int main(int argc, char *argv[])
// {
//     if (argc != 2)
//     {
//         std::cout << "Usage:" << argv[0] << " port" << std::endl;
//         return 1;
//     }
//     uint16_t port = std::stoi(argv[1]);

//     // 路由对象提供路由功能
//     Route r;
//     // 网络服务器对象提供通信功能
//     Refresh_Log_To_Console();
//     std::unique_ptr<UdpServer> server = std::make_unique<UdpServer>(port, [&r](int sockfd, const std::string &message, InetAddr &peer)
//                                                                     { r.MessageRoute(sockfd, message, peer); });
//     server->Init();
//     server->Start();
//     return 0;
// }

// std::string DefaultHandler(const std::string &messages)
// {
//     std::string s = "***";
//     s = s + messages + "***";
//     return s;
// }

// // 格式为：udpserver port
// int main(int argc, char *argv[])
// {
//     if (argc != 2)
//     {
//         std::cout << "Usage:" << argv[0] << " port" << std::endl;
//         return 1;
//     }
//     uint16_t port = std::stoi(argv[1]);
//     Refresh_Log_To_Console();
//     // 初始化时传回调方法
//     std::unique_ptr<UdpServer> server = std::make_unique<UdpServer>(port, DefaultHandler);
//     server->Init();
//     server->Start();
//     return 0;
// }

// // 格式为：udpserver port
// int main(int argc, char *argv[])
// {
//     if (argc != 2)
//     {
//         std::cout << "Usage:" << argv[0] << " port" << std::endl;
//         return 1;
//     }
//     uint16_t port = std::stoi(argv[1]);
//     Refresh_Log_To_Console();
//     std::unique_ptr<UdpServer> server = std::make_unique<UdpServer>(port);
//     server->Init();
//     server->Start();
//     return 0;
// }

// // 格式为：udpserver ip port
// int main(int argc, char *argv[])
// {
//     if (argc != 3)
//     {
//         std::cout << "Usage:" << argv[0] << " ip port" << std::endl;
//         return 1;
//     }
//     std::string ip = argv[1];
//     uint16_t port = std::stoi(argv[2]);
//     Refresh_Log_To_Console();
//     std::unique_ptr<UdpServer> server = std::make_unique<UdpServer>(ip, port);
//     server->Init();
//     server->Start();
//     return 0;
// }